<?php

namespace Common\Model;



/**

 * 生成多层树状下拉选框的工具模型

 */

class TreeModel {

	/**

     * 把返回的数据集转换成Tree

     * @access public

     * @param array $list 要转换的数据集

     * @param string $pid parent标记字段

     * @param string $level level标记字段

     * @return array

     */

	public function toTree($list=null, $pk='id',$pid = 'pid',$child = '_child'){

		if(null === $list) {

            // 默认直接取查询返回的结果集合

			$list   =   &$this->dataList;

		}

        // 创建Tree

		$tree = array();

		if(is_array($list)) {

            // 创建基于主键的数组引用

			$refer = array();



			foreach ($list as $key => $data) {

				$_key = is_object($data)?$data->$pk:$data[$pk];

				$refer[$_key] =& $list[$key];

			}

			foreach ($list as $key => $data) {

                // 判断是否存在parent

				$parentId = is_object($data)?$data->$pid:$data[$pid];

				$is_exist_pid = false;

				foreach($refer as $k=>$v){

					if($parentId==$k){

						$is_exist_pid = true;

						break;

					}

				}

				if ($is_exist_pid) {

					if (isset($refer[$parentId])) {

						$parent =& $refer[$parentId];

						$parent[$child][] =& $list[$key];

					}

				} else {

					$tree[] =& $list[$key];

				}

			}

		}

		return $tree;

	}



	/**

	 * 将格式数组转换为树

	 *

	 * @param array $list

	 * @param integer $level 进行递归时传递用的参数

	 */

	private $formatTree; //用于树型数组完成递归格式的全局变量

	private function _toFormatTree($list,$level=0,$title = 'title') {

		foreach($list as $key=>$val){

			$tmp_str=str_repeat("&nbsp;",$level*2);

			$tmp_str.="└";



			$val['level'] = $level;

			$val['title_show'] =$level==0?$val[$title]."&nbsp;":$tmp_str.$val[$title]."&nbsp;";

				// $val['title_show'] = $val['id'].'|'.$level.'级|'.$val['title_show'];

			if(!array_key_exists('_child',$val)){

				array_push($this->formatTree,$val);

			}else{

				$tmp_ary = $val['_child'];

				unset($val['_child']);

				array_push($this->formatTree,$val);

				   $this->_toFormatTree($tmp_ary,$level+1,$title); //进行下一层递归

				}

			}

			return;

		}



		public function toFormatTree($list,$title = 'title',$pk='id',$pid = 'pid',$root = 0){

			$list = list_to_tree($list,$pk,$pid,'_child',$root);

			$this->formatTree = array();

			$this->_toFormatTree($list,0,$title);

			return $this->formatTree;

		}

	}

	?>

